#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

void headler(int signal)
{
    //第一个版本，当有多个子进程同时退出时，会有遗漏的，因为信号只能保持一个
    /*std::cout<<"子进程退出，父进程收到信号"<<signal<<std::endl;
    pid_t id=waitpid(-1,nullptr,0);
    if(id>0)
    {
        std::cout<<"等待成功,子进程pid为"<<id<<std::endl;
    }
    else
    {
        perror("waitpid");
    }*/
    //第二个版本
    std::cout<<"子进程退出，父进程收到信号"<<std::endl;
    while(true)
    {
        pid_t id=waitpid(-1,nullptr,WNOHANG);//要以非阻塞等待
        if(id>0)
        {
            std::cout<<"等待成功,子进程pid为"<<std::endl;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    pid_t id=fork();
    signal(SIGCHLD,headler);
    if(id==0)
    {
        //当前是子进程
        int cnt=5;
        while(cnt--)
        {
            std::cout<<"当前是子进程 pid:"<<getpid()<<std::endl;
            sleep(2);
        }
        std::cout<<"子进程退出,向父进程发送SIGCHLD信号"<<std::endl;
        exit(0);
    }
    //当前是父进程
    //此时父进程就可以不再阻塞等待子进程转而执行自己的程序
    while(true)
    {
        std::cout<<"当前是父进程"<<std::endl;
        sleep(1);
    }
    return 0;
}